"""
股票数据分析系统 - 配置文件
该文件包含系统的所有配置参数，便于统一管理和修改
"""

# ==================== 数据源配置 ====================
# 选择使用的数据源平台
# 选项:
#   'yfinance' - Yahoo Finance (国际股票)
#   'akshare' - AKShare (中国A股/期货) - 🚀 已优化配置
#   'tushare' - Tushare (专业金融数据，需要token)
#   'baostock' - Baostock (免费A股数据平台) - 🎯 推荐默认
DATA_SOURCE = 'baostock'

# AKShare特定配置
AKSHARE_CONFIG = {
    'adjust': 'qfq',  # 前复权，避免除权除息影响
    'timeout': 30,    # 请求超时时间
    'retry_count': 3, # 重试次数
    'enable_cache': True,  # 启用缓存
    'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

# API请求超时时间（秒）
API_TIMEOUT = 15

# Tushare API token（如果使用Tushare数据源）
TUSHARE_TOKEN = 'your_tushare_token_here'

# ==================== K线周期配置 ====================
# 系统支持的K线周期列表
SUPPORTED_PERIODS = ['60分钟', '日线', '周线', '月线']

# K线周期到数据源参数的映射
# 注意：不同数据源可能需要不同的周期参数格式
PERIOD_MAPPING = {
    # 通用映射
    '60分钟': '1h',
    '日线': '1d',
    '周线': '1wk',
    '月线': '1mo',

    # Yahoo Finance特定映射
    'yfinance': {
        '60分钟': '60m',
        '日线': '1d',
        '周线': '1wk',
        '月线': '1mo'
    },

    # AKShare特定映射 - 🚀 已优化
    'akshare': {
        '60分钟': '60',      # 60分钟K线
        '日线': 'daily',     # 日K线 (优化后使用daily)
        '周线': 'weekly',    # 周K线 (优化后使用weekly)
        '月线': 'monthly'    # 月K线 (优化后使用monthly)
    },

    # Baostock特定映射
    'baostock': {
        '60分钟': '60',  # 60分钟
        '日线': 'd',    # 日线
        '周线': 'w',    # 周线
        '月线': 'm'     # 月线
    }
}

# ==================== 技术指标参数配置 ====================
# TA-Lib技术指标计算参数

# 默认技术指标参数（向后兼容）
MA_PERIODS = [5, 10, 20, 60]  # 5日、10日、20日、60日均线
RSI_PERIOD = 14
MACD_PARAMS = (12, 26, 9)
BOLL_PARAMS = (20, 2)
KDJ_PARAMS = (9, 3, 3)

# ==================== 周期特定参数配置 ====================
# 根据不同K线周期配置合适的技术指标参数
# 原理：不同时间框架需要不同的参数来获得有意义的分析结果

PERIOD_SPECIFIC_PARAMS = {
    '60分钟': {
        # 60分钟线参数 - 适合短期交易分析
        'MA_PERIODS': [5, 10, 20, 48],      # 5小时、10小时、20小时、2天(48小时)
        'RSI_PERIOD': 14,                    # 14小时 - 标准RSI周期
        'MACD_PARAMS': (12, 26, 9),         # 标准MACD参数，适合小时级别
        'BOLL_PARAMS': (20, 2),             # 20小时布林带
        'KDJ_PARAMS': (9, 3, 3),            # 9小时KDJ，反应较快
        'description': '60分钟线参数，适合日内短期交易分析'
    },

    '日线': {
        # 日线参数 - 经典技术分析参数
        'MA_PERIODS': [5, 10, 20, 60],      # 5天、10天、20天、60天(3个月)
        'RSI_PERIOD': 14,                    # 14天 - 经典RSI周期
        'MACD_PARAMS': (12, 26, 9),         # 经典MACD参数
        'BOLL_PARAMS': (20, 2),             # 20天布林带
        'KDJ_PARAMS': (9, 3, 3),            # 9天KDJ
        'description': '日线参数，经典技术分析标准配置'
    },

    '周线': {
        # 周线参数 - 适合中期趋势分析
        'MA_PERIODS': [4, 8, 13, 26],       # 1月、2月、3月、6个月
        'RSI_PERIOD': 14,                    # 14周 - 约3.5个月
        'MACD_PARAMS': (12, 26, 9),         # 标准MACD，在周线上更稳定
        'BOLL_PARAMS': (20, 2),             # 20周布林带，约5个月
        'KDJ_PARAMS': (9, 3, 3),            # 9周KDJ，约2个月
        'description': '周线参数，适合中期趋势和波段操作分析'
    },

    '月线': {
        # 月线参数 - 适合长期投资分析
        'MA_PERIODS': [3, 6, 12, 24],       # 3月、6月、1年、2年
        'RSI_PERIOD': 14,                    # 14月 - 约1年多
        'MACD_PARAMS': (12, 26, 9),         # 标准MACD，长期趋势
        'BOLL_PARAMS': (20, 2),             # 20月布林带，约1.7年
        'KDJ_PARAMS': (9, 3, 3),            # 9月KDJ，约9个月
        'description': '月线参数，适合长期投资和大趋势分析'
    }
}

# ==================== 中文列名映射配置 ====================
# 将英文列名映射为中文列名，便于用户理解

CHINESE_COLUMN_MAPPING = {
    # 基础数据
    'timestamp': '时间',
    'open': '开盘价',
    'high': '最高价',
    'low': '最低价',
    'close': '收盘价',
    'volume': '成交量',
    'symbol': '股票代码',

    # 移动平均线
    'MA5': '5日均线',
    'MA10': '10日均线',
    'MA20': '20日均线',
    'MA60': '60日均线',
    'MA4': '4周均线',
    'MA8': '8周均线',
    'MA13': '13周均线',
    'MA26': '26周均线',
    'MA3': '3月均线',
    'MA6': '6月均线',
    'MA12': '12月均线',
    'MA24': '24月均线',
    'MA48': '48小时均线',

    # 指数移动平均线
    'EMA5': '5日指数均线',
    'EMA10': '10日指数均线',
    'EMA20': '20日指数均线',
    'EMA60': '60日指数均线',

    # RSI指标
    'RSI': 'RSI相对强弱指数',
    'RSI_OVERBOUGHT': 'RSI超买信号',
    'RSI_OVERSOLD': 'RSI超卖信号',

    # MACD指标
    'MACD': 'MACD快慢线差值',
    'MACD_SIGNAL': 'MACD信号线',
    'MACD_HIST': 'MACD柱状图',
    'MACD_CROSS': 'MACD金叉死叉',

    # 布林带
    'BOLL_UPPER': '布林带上轨',
    'BOLL_MIDDLE': '布林带中轨',
    'BOLL_LOWER': '布林带下轨',
    'BOLL_WIDTH': '布林带宽度',
    'PRICE_BOLL_POS': '价格布林带位置',
    'BOLL_BREAKOUT': '布林带突破',

    # KDJ指标
    'KDJ_K': 'KDJ_K值',
    'KDJ_D': 'KDJ_D值',
    'KDJ_J': 'KDJ_J值',
    'KDJ_GOLDEN_CROSS': 'KDJ金叉',
    'KDJ_DEATH_CROSS': 'KDJ死叉',

    # 高级技术指标
    'ATR': '真实波动幅度',
    'ATR_PERCENT': 'ATR百分比',
    'ADX': '平均趋向指数',
    'PLUS_DI': '正向指标',
    'MINUS_DI': '负向指标',
    'CCI': '商品通道指数',
    'CCI_OVERBOUGHT': 'CCI超买',
    'CCI_OVERSOLD': 'CCI超卖',
    'WILLR': '威廉指标',
    'WILLR_OVERBOUGHT': '威廉超买',
    'WILLR_OVERSOLD': '威廉超卖',
    'STOCH_RSI_K': '随机RSI_K',
    'STOCH_RSI_D': '随机RSI_D',
    'TRIX': '三重指数平滑',
    'ROC': '变动率指标',
    'ROC_MA': 'ROC移动平均',
    'MOM': '动量指标',
    'AROON_UP': '阿隆上线',
    'AROON_DOWN': '阿隆下线',
    'AROON_OSC': '阿隆振荡器',

    # 市场情绪指标
    'FEAR_GREED_INDEX': '恐慌贪婪指数',
    'MARKET_SENTIMENT': '市场情绪',
    'MARKET_STRENGTH': '市场强度',
    'PRICE_POSITION': '价格位置百分比',

    # 成交量指标
    'OBV': '能量潮指标',
    'OBV_MA': 'OBV移动平均',
    'OBV_SIGNAL': 'OBV信号',
    'VWAP': '成交量加权均价',
    'VWAP_DEVIATION': 'VWAP偏离度',
    'MFI': '资金流量指数',
    'MFI_OVERBOUGHT': 'MFI超买',
    'MFI_OVERSOLD': 'MFI超卖',
    'AD': '累积派发线',
    'AD_OSC': 'AD振荡器',
    'VOLUME_RATIO': '成交量比率',
    'VOLUME_SPIKE': '成交量异常',
    'PRICE_VOLUME_DIVERGENCE': '价量背离',
    'VOLUME_RSI': '成交量RSI',

    # 波动率指标
    'HV_5': '5日历史波动率',
    'HV_20': '20日历史波动率',
    'HV_60': '60日历史波动率',
    'HV_PERCENTILE': '波动率分位数',
    'VOLATILITY_CONE': '波动率锥',
    'REALIZED_VOL': '实现波动率',
    'VOL_BREAKOUT': '波动率突破',
    'VOL_MEAN_REVERSION': '波动率均值回归',
    'VOL_TREND': '波动率趋势',

    # 交易信号
    'LONG_SIGNAL_BASIC': '基础多头信号',
    'SHORT_SIGNAL_BASIC': '基础空头信号',
    'LONG_STRENGTH': '多头强度',
    'SHORT_STRENGTH': '空头强度',
    'LONG_SIGNAL': '多头信号',
    'SHORT_SIGNAL': '空头信号',

    # 精准入场信号
    'BREAKOUT_LONG': '突破多头',
    'BREAKOUT_SHORT': '突破空头',
    'BEARISH_DIVERGENCE': '顶背离',
    'BULLISH_DIVERGENCE': '底背离',
    'HAMMER': '锤子线',
    'HANGING_MAN': '上吊线',

    # 风险管理
    'STOP_LOSS_LONG': '多头止损位',
    'STOP_LOSS_SHORT': '空头止损位',
    'TRAILING_STOP_LONG': '多头追踪止损',
    'TRAILING_STOP_SHORT': '空头追踪止损',
    'POSITION_SIZE': '建议仓位大小',
    'RISK_LEVEL': '风险评分',
    'RISK_CATEGORY': '风险等级',
    'MAX_POSITION': '最大仓位',

    # 综合评分
    'TREND_SCORE': '趋势评分',
    'MOMENTUM_SCORE': '动量评分',
    'FINAL_SCORE': '综合评分',
    'TRADE_RECOMMENDATION': '交易建议',
    'TREND_STRENGTH': '趋势强度'
}

# 获取指定周期的参数
def get_period_params(period_name):
    """
    获取指定K线周期的技术指标参数
    :param period_name: K线周期名称
    :return: 参数字典，如果周期不存在则返回默认参数
    """
    if period_name in PERIOD_SPECIFIC_PARAMS:
        return PERIOD_SPECIFIC_PARAMS[period_name]
    else:
        # 返回默认参数（向后兼容）
        return {
            'MA_PERIODS': MA_PERIODS,
            'RSI_PERIOD': RSI_PERIOD,
            'MACD_PARAMS': MACD_PARAMS,
            'BOLL_PARAMS': BOLL_PARAMS,
            'KDJ_PARAMS': KDJ_PARAMS,
            'description': '默认参数配置'
        }

def apply_chinese_column_names(df):
    """
    将DataFrame的英文列名转换为中文列名
    :param df: 原始DataFrame
    :return: 列名转换后的DataFrame
    """
    # 创建列名映射字典，只映射存在的列
    rename_dict = {}
    for eng_name, chi_name in CHINESE_COLUMN_MAPPING.items():
        if eng_name in df.columns:
            rename_dict[eng_name] = chi_name

    # 应用列名映射
    df_renamed = df.rename(columns=rename_dict)

    # 记录映射信息
    mapped_count = len(rename_dict)
    total_count = len(df.columns)

    print(f"📝 列名中文化完成: {mapped_count}/{total_count} 列已映射为中文")

    return df_renamed

# 需要计算的技术指标列表
ENABLED_INDICATORS = [
    'MA',     # 移动平均线
    'RSI',    # 相对强弱指数
    'MACD',   # 指数平滑异同平均线
    'BOLL',   # 布林带
    'KDJ'     # 随机指标
]

# ==================== 数据清洗配置 ====================
# 允许的最大价格波动百分比（过滤异常值）
MAX_PRICE_CHANGE = 30  # 百分比

# 缺失数据处理方式:
#   'drop' - 删除包含缺失值的行
#   'fill' - 使用前向填充
MISSING_DATA_HANDLING = 'fill'

# 需要验证的数据列
REQUIRED_COLUMNS = ['timestamp', 'open', 'high', 'low', 'close', 'volume']

# ==================== 输出配置 ====================
# 默认输出文件名格式
# 可用变量: {symbol}, {period}, {date}
OUTPUT_FILENAME_FORMAT = "{symbol}_{period}_{date}_analysis.csv"

# 输出文件编码
OUTPUT_ENCODING = 'utf-8-sig'  # 支持Excel打开中文不乱码

# 是否在保存前显示数据预览
SHOW_DATA_PREVIEW = True

# 预览显示的行数
PREVIEW_ROWS = 5

# ==================== 日志配置 ====================
# 日志级别: DEBUG, INFO, WARNING, ERROR, CRITICAL
LOG_LEVEL = 'INFO'

# 日志格式
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

# 日志文件配置
ENABLE_LOG_FILE = True
LOG_FILENAME = 'stock_analysis.log'

# ==================== 高级配置 ====================
# 是否启用缓存（减少API调用）
ENABLE_CACHE = True
CACHE_EXPIRY_HOURS = 24  # 缓存有效期（小时）

# 重试设置
MAX_RETRIES = 3  # 最大重试次数
RETRY_DELAY = 2  # 重试延迟（秒）

# 多线程设置（用于批量获取数据）
ENABLE_MULTITHREADING = False
MAX_THREADS = 4

# ==================== 配置验证 ====================
def validate_config():
    """
    验证配置的有效性，确保系统设置正确
    """
    # 检查数据源是否有效
    valid_sources = ['yfinance', 'akshare', 'tushare', 'baostock']
    if DATA_SOURCE not in valid_sources:
        raise ValueError(f"无效的数据源: {DATA_SOURCE}. 有效选项: {valid_sources}")
    
    # 检查周期映射是否完整
    for period in SUPPORTED_PERIODS:
        if period not in PERIOD_MAPPING:
            raise ValueError(f"缺少周期映射: {period}")
    
    # 检查指标参数
    if RSI_PERIOD <= 0:
        raise ValueError("RSI周期必须为正整数")
    
    # 检查输出文件名格式
    if "{symbol}" not in OUTPUT_FILENAME_FORMAT:
        raise ValueError("输出文件名格式必须包含 {symbol} 变量")
    
    print("配置验证通过")

# 启动时自动验证配置
if __name__ != "__main__":
    validate_config()

# ==================== 配置说明 ====================
if __name__ == "__main__":
    """
    当直接运行此文件时，显示配置摘要
    """
    print("=" * 50)
    print("股票数据分析系统 - 配置摘要")
    print("=" * 50)
    print(f"数据源: {DATA_SOURCE}")
    print(f"支持的K线周期: {', '.join(SUPPORTED_PERIODS)}")
    print(f"启用的技术指标: {', '.join(ENABLED_INDICATORS)}")
    print(f"移动平均线周期: {MA_PERIODS}")
    print(f"RSI周期: {RSI_PERIOD}")
    print(f"MACD参数: {MACD_PARAMS}")
    print(f"布林带参数: {BOLL_PARAMS}")
    print(f"日志级别: {LOG_LEVEL}")
    print("=" * 50)
    print("运行 validate_config() 验证配置有效性")